package com.zmn.oms.model.dto.order.zmn;

import com.zmn.common.constant.GlobalConsts;
import com.zmn.oms.common.dto.OmsBaseOperator;
import com.zmn.oms.model.dto.order.NewOrderDistributeMasterDTO;
import com.zmn.oms.model.dto.order.NewOrderExternalShopDTO;
import com.zmn.oms.model.dto.order.proxy.OrderDiscountDTO;
import com.zmn.oms.model.dto.product.OrderProductDTO;
import com.zmn.oms.model.entity.discount.OrderDiscount;
import com.zmn.oms.model.entity.discount.OrderPayDiscount;
import com.zmn.oms.model.entity.post.OrderPost;
import com.zmn.oms.model.entity.serviceitem.OrderServiceItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;

/**
 * 类描述: 普通新单
 *
 * @author liuying
 * @date 2018/11/26 4:34 PM
 */
@Data
@ToString(callSuper = true)
public class ZsNormalNewOrderDTO extends OmsBaseOperator {

    /**
     * 城市id
     */
    @NotNull(message = "城市不能为空")
    private Integer cityId;

    /**
     * 订单类型：1 新单、2 返修单
     */
    @NotNull(message = "订单类型不能为空")
    private Integer type;

    /**
     * 源头工单id
     */
    private Long originalId;

    /**
     * 预约时间
     */
    private Date dutyTime;

    /**
     * 预约状态(1 预约失败 2 预约成功)
     */
    private Integer dutyStatus;

    /**
     * 预约失败code
     */
    private Integer dutyFailCode;

    /**
     * 下次联系时间
     */
    private Date nextContactTime;

    /**
     * 用户名称
     */
    private String userName;

    /**
     * 客户名称
     */
    private String contactName;

    /**
     * 性别：1 男; 2 女; 3 保密
     */
    private Integer gender;

    /**
     * 区县ID
     */
    private Integer countyId;

    /**
     * 街道Id
     */
    private Integer streetId;

    /**
     * 街道
     */
    @NotEmpty(message = "用户地址不能为空")
    private String street;

    /**
     * 地址来源  1：地址库 2：百度 3:手动街道
     */
    private Integer streetSource;


    /**
     * 客户地址具体门牌号
     */
    private String address;

    /**
     * 客户电话1
     */
    @NotEmpty(message = "用户电话不能为空")
    private String telephone;

    /**
     * 客户电话2
     */
    private String telephone2;

    /**
     * 客户电话3
     */
    private String telephone3;

    /**
     * 服务分类id
     */
    @NotNull(message = "服务分类不能为空")
    private Integer servCategId;

    /**
     * 产品分类id（二级分类）
     */
    private Integer categId;

    /**
     * 订单客户备注
     */
    @Size(max = 5000, message = "备注最多5000个字符")
    private String remark;

    /**
     * 产品列表
     */
    @NotNull(message = "服务产品不能为空")
    private List<OrderProductDTO> orderProductList;

    /**
     * 渠道ID
     */
    @NotNull(message = "来源渠道不能为空")
    private Integer channelId;

    /**
     * 公司ID
     */
    private Integer companyId;

    /**
     * 服务公司(服务商)ID
     */
    private Integer manageCompanyId;

    /**
     * 返修订单ID
     */
    private Long reworkId;

    private Long copyOrderId;
    private Long copyWorkId;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 用户类型：1普通用户，2企业客户
     */
    private Integer userType;

    /**
     * 经度
     */
    @NotNull(message = "位置信息不能为空")
    private Double longitude;

    /**
     * 纬度
     */
    @NotNull(message = "位置信息不能为空")
    private Double latitude;

    /**
     * 外部订单ID
     */
    private String outerId;

    /**
     * 外部用户ID
     */
    private String outerUserId;

    /**
     * 工单录入方式：1后台人工录入、2微信/H5、 3接口(114,号百,360等)
     */
    private Integer inputType;

    /**
     * 是否禁止弃单 1：否，可以弃单  2：不允许弃单
     */
    private Integer disableDiscard;

    /**
     * 呼叫ID
     */
    private String callId;

    /**
     * 线索ID（内部）
     */
    private Long clueId;

    /**
     * 订单优惠信息
     * @see ZsNormalNewOrderDTO#discountItemCodes 店铺下单，优惠券码
     * @see ZsNormalNewOrderDTO#channelDiscountAmount 渠道下单，优惠金额
     */
    private List<OrderDiscountDTO> orderDiscountList;

    /**
     * 购物车下单专用
     */
    private List<OrderDiscount> mosOrderDiscountList;

    /**
     * 订单服务项列表
     */
    private List<OrderServiceItem> orderServiceItemList;

    /**
     * 意向单(如果是)
     */
    private Integer orderPurposeId;

    /**
     * 来源
     */
    private Integer sourceType;

    /**
     * 来源平台
     */
    private Integer plat;

    /**
     * 服务平台
     */
    private Integer platWork;

    /**
     * 订单业务类型：1保外业务（C），2保内业务（F），3工程业务（B）
     */
    private Integer bizType;

    /**
     * 预付款
     */
    private Integer prepayAmount;

    /**
     * 渠道预付
     */
    private Integer channelPrepayAmount;

    /**
     * 渠道预付款凭证
     */
    private String channelPrepayCertificateSrc;

    /**
     * 渠道预付状态
     */
    private Integer channelPrepayStatus;

    /**
     * 接单时间
     */
    private Date assignConfirmTime;

    /**
     * 一口价
     */
    private Integer finalPrice;

    /**
     * 支付方式 1 先付 2 后付
     */
    private Integer payType;

	/**
	 * 店铺Id
	 */
	private Integer shopId;

    /**
     * 店铺下单 场景id
     */
    private String sceneId;

    /**
     * 来源渠道id
     */
    private Integer sourceChannelId;

    /**
     * 下单入口id
     * @see com.zmn.consts.GateTypeConsts
     */
    private Integer receiveEntranceId;

    /**
     * 下单方式 1:人工录入 2：接口录入
     */
    private Integer receiverManner;

    /**
     * 推荐人id
     */
    private Long recommenderId;

    /**
     * 推荐人类型 3 工程师
     */
    private Integer recommenderType;

    /**
     * 服务项类型，目前仅支持两种类型： 1.工单服务项 2.故障服务项
     * 若值不等于2，则均作为值等于1处理
     * @see com.zmn.oms.common.constant.OrderConsts#SERVICE_ITEM_TYPE_ORDER
     * @see com.zmn.oms.common.constant.OrderConsts#SERVICE_ITEM_TYPE_FAULT
     */
    private Integer servItemType;

    /**
     * 故障项报价ID
     */
    private Integer quotationId;

    /**
     * 报价人类型 1：系统 2：员工 3：工程师 4：用户 5：厂商 6：服务商 7：大客户 8：渠道
     * @See GlobalConsts.OPERATE_USER_TYPE_*
     */
    private Integer quotationType;

    /**
     * 店铺下单，优惠券码
     */
    private List<String> discountItemCodes;

    /**
     * 优惠调用发起者，1系统，2用户
     */
    private Integer discountInvoker;

    /**
     * 促销id
     */
    private Integer promId;

    /**
     * 渠道下单，渠道优惠金额
     */
    private Integer channelDiscountAmount;

    /**
     * 快递信息
     */
    private List<OrderPost> orderPostList;

    /**
     * 防刷单检查  2020.09.09 by lhl
     *  1：false  2：true  为空时，默认为2
     */
    private Integer clickFarmingCheck;

    /**
     * 是否是要客订单。lhl-2020.09.07
     * 2:是  1:否
     */
    private Integer vvip;

    /**
     * 特殊优惠-全免-总公司承担。lhl-2020.09.08
     * 2:是  非2：否
     */
    private Integer unusualDiscount;

    /**
     * 是否自动派单(1.否  2.是)
     */
    private Integer autoDistribute;

    /**
     * 扩展数据
     */
    private OrderExtendDTO orderExtend;

    /**
     * 渠道登录手机号(用于第三方平台的登录用户) lhl-2020.12.16
     */
    private String channelLoginPhone;

    /**
     * 渠道订单线索ID  lhl-2021.01.04
     */
    private Long orderClueId;

    /**
     * 小程序议价标示 1、为确认报价  2、为议价价格报价清单
     */
    private Integer negotiatedPriceFlag;

    /**
     * 预分配服务公司 id
     */
    private Integer preManageCompanyId;

    /**
     * 预分配服务公司名称
     */
    private String preManageCompanyName;

    /**
     * 下单时间
     */
    private Date createTime;

    /**
     * 是否是测试单
     *  1：否  2：是  为空时，默认为1
     */
    private Integer test = GlobalConsts.NO;

    /**
     * 订单标签ID
     */
    private List<Integer> orderTagIdList;

    /**
     * 专题活动ID
     */
    @ApiModelProperty(value = "专题活动ID")
    private Integer activityId;

    /**
     * 派单工程师信息
     */
    private NewOrderDistributeMasterDTO distributeMasterDTO;

    /**
     * 一口价订单扩展数据
     */
    private FinalPriceNewOrderExtDTO finalPriceNewOrderExtDTO;

    /**
     * 支付优惠分摊优惠
     */
    private List<OrderPayDiscount> orderPayDiscountList;

    /**
     * 行政子公司id
     */
    private Integer gridCompanyId;

    /**
     * 行政服务商id
     */
    private Integer gridManageCompanyId;

    /**
     * 下单备注
     */
    @Size(max = 500)
    private List<CommonRemarkDTO> commonRemarkList;

    /**
     *  请求ID
     *  访问当前页面生成的唯一标识
     */
    private String requestId;

    /**
     * 外部店铺信息
     */
    private NewOrderExternalShopDTO externalShopInfo;
}
